home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / stdwin / Ports / mac / fullpath.c < prev    next >
Text File  |  1995-12-21  |  1KB  |  65 lines

  1. /* GET FULL PATHNAME OF A FILE. */
  2.  
  3. #include "macwin.h"
  4. #include <Files.h>
  5.  
  6. /* Mac file system parameters */
  7. #define MAXPATH 256    /* Max path name length+1 */
  8. #define SEP ':'        /* Separator in path names */
  9. #define ROOTID 2    /* DirID of a volume's root directory */
  10.  
  11. /* Macro to find out whether we can do HFS-only calls: */
  12. #define FSFCBLen (* (short *) 0x3f6)
  13. #define hfsrunning() (FSFCBLen > 0)
  14.  
  15. char *
  16. getdirname(dir)
  17.     int dir; /* WDRefNum */
  18. {
  19.     union {
  20.         HFileInfo f;
  21.         DirInfo d;
  22.         WDPBRec w;
  23.         VolumeParam v;
  24.     } pb;
  25.     static char cwd[2*MAXPATH];
  26.     unsigned char namebuf[MAXPATH];
  27.     short err;
  28.     long dirid= 0;
  29.     char *next= cwd + sizeof cwd - 1;
  30.     int len;
  31.     
  32.     if (!hfsrunning())
  33.         return "";
  34.     
  35.     for (;;) {
  36.         pb.d.ioNamePtr= namebuf;
  37.         pb.d.ioVRefNum= dir;
  38.         pb.d.ioFDirIndex= -1;
  39.         pb.d.ioDrDirID= dirid;
  40.         err= PBGetCatInfo((CInfoPBPtr)&pb.d, FALSE);
  41.         if (err != noErr) {
  42.             dprintf("PBCatInfo err %d", err);
  43.             return NULL;
  44.         }
  45.         *--next= SEP;
  46.         len= namebuf[0];
  47.         /* XXX There is no overflow check on cwd here! */
  48.         strncpy(next -= len, (char *)namebuf+1, len);
  49.         if (pb.d.ioDrDirID == ROOTID)
  50.             break;
  51.         dirid= pb.d.ioDrParID;
  52.     }
  53.     return next;
  54. }
  55.  
  56. void
  57. fullpath(buf, wdrefnum, file)
  58.     char *buf;
  59.     int wdrefnum;
  60.     char *file;
  61. {
  62.     strcpy(buf, getdirname(wdrefnum));
  63.     strcat(buf, file);
  64. }
  65.